# -*- coding: utf-8 -*-
"""
    xfree.utils.settings
    ~~~~~~~~~~~~~~~~~~~~~
    文件描述：这个模块包含了与 xfree 配置进行交互的接口。
    作者：xfree
    邮箱：cy_83k@qq.com
"""

import logging
from collections.abc import MutableMapping

from xfree.admin.models import Setting

# 创建一个日志记录器
logger = logging.getLogger(__name__)


class XFreeConfig(MutableMapping):
    """
    提供一个类似字典的接口，用于与 XFree 的设置缓存进行交互。
    构造函数会接收任意数量的位置参数和关键字参数，并将它们转换为字典来初始化实例。
    """

    def __init__(self, *args, **kwargs):
        # 使用字典的 update 方法来初始化实例的内容
        self.update(dict(*args, **kwargs))

    # 获取指定键对应的值，如果键不存在，则返回 None，并记录日志信息
    def __getitem__(self, key):
        try:
            return Setting.as_dict()[key]
        except KeyError:
            logger.info(f"找不到钥匙 ${key} 设置。")
            return None

    # 设置指定键的值，并调用 Setting 的 update 方法进行更新
    def __setitem__(self, key, value):
        Setting.update({key.lower(): value})

    # 暂不实现删除键的功能
    def __delitem__(self, key):  # pragma: no cover
        pass

    # 返回可迭代对象，遍历 Setting 的字典表示中的键
    def __iter__(self):
        return iter(Setting.as_dict())

    # 返回 Setting 字典表示的长度
    def __len__(self):
        return len(Setting.as_dict())


# 创建一个 xfreeConfig 的实例，可用于全局访问 xfree 的配置
xfree_config = XFreeConfig()